#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 导入树莓派GPIO控制库
import RPi.GPIO as GPIO

# 电机驱动引脚定义
# EA/EB: 使能端（PWM控制速度） I1-I4: 方向控制端
EA, I2, I1, EB, I4, I3 = (13, 19, 26, 16, 20, 21)
# PWM频率设置为50Hz（适合直流电机控制）
FREQUENCY = 50
# 电机A占空比配置：前进20% 左转20% 停止0% 右转0%
DUTYS_A = {'w':20,'a':20, 's':0, 'd':0}
# 电机B占空比配置：前进20% 左转0% 停止0% 右转20%
DUTYS_B = {'w':20,'a':0,'s':0, 'd':20 }
# 指令反馈信息表
EXPRESSIONS = {'w':'move forward!',
               'a':'turn left!',
               's':'stop!',
               'd':'turn right!'}

# 初始化GPIO设置
GPIO.setmode(GPIO.BCM)  # 使用BCM引脚编号方案
# 批量设置所有控制引脚为输出模式
GPIO.setup([EA, I2, I1, EB, I4, I3], GPIO.OUT)
# 初始化电平状态：使能端低电平，方向控制端组合
# （I1和I4高电平，I2和I3低电平）
GPIO.output([EA, I2, EB, I3], GPIO.LOW)  
# 关闭使能，I2和I3低电平
GPIO.output([I1, I4], GPIO.HIGH)         
# I1和I4高电平

# 创建PWM实例（软件模拟PWM），对使能采用PWM来控制电机驱动
pwma = GPIO.PWM(EA, FREQUENCY)  # 电机A使能端PWM
pwmb = GPIO.PWM(EB, FREQUENCY)  # 电机B使能端PWM
# 启动PWM并初始化占空比为0%（电机停止）
pwma.start(DUTYS_A['s'])
pwmb.start(DUTYS_B['s'])
print("ready!")  # 系统准备就绪提示

# 主控制循环
while True:
    cmd = input("command >> ")  # 获取用户输入指令
    if cmd == 'q':
        # 退出程序：停止PWM并清理GPIO资源
        pwma.stop()    # 终止电机A PWM信号
        pwmb.stop()    # 终止电机B PWM信号
        GPIO.cleanup() # 清理所有GPIO引脚状态
        break          # 退出主循环
    elif (cmd=='w') or (cmd=='a')\
          or (cmd=='s') or (cmd=='d'):
        # 动态调整双电机占空比（实现方向控制）
        pwma.ChangeDutyCycle(DUTYS_A[cmd]) 
         # 更新电机A动力输出
        pwmb.ChangeDutyCycle(DUTYS_B[cmd]) 
         # 更新电机B动力输出
        print(EXPRESSIONS[cmd])  # 显示当前动作状态反馈
    else:
        # 无效指令进行忽略
        pass